home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / dev / e / jrhrkrm2.lzh / RKRM_PartTwo / Keymap / appkeymap.e next >
Text File  |  1995-09-20  |  6KB  |  156 lines

  1. -> appkeymap.e - Subroutines to copy the default keymap, modify the copy
  2. ->
  3. -> Usage: (PTR TO keymap) appkeymap:=createAppKeyMap()
  4. ->        PROC deleteAppKeyMap(appkeymap:PTR TO keymap)
  5. ->
  6. -> This example modifies the copied keymap by unmapping all of the numeric
  7. -> keypad keys.  This creates a good keymap for use with either keymap.library
  8. -> MapANSI() or commodities InvertString().  If you used a default keymap with
  9. -> the above functions, numeric keypad raw key values would be returned for
  10. -> keys which are available with fewer keypresses on numeric pad than on the
  11. -> normal keyboard.  It is generally preferable to have the normal keyboard
  12. -> raw values since many applications attach special meanings to numeric pad
  13. -> keys.  The AlterAppKeyMap() routine in this module could easilty be
  14. -> modified to instead set new values for numeric pad or function keys.
  15. ->
  16. -> IMPORTANT: Do Not Use SetKeyMapDefault() unless you are a system
  17. -> preferences editor OR an application that takes over the machine.  If you
  18. -> want to use a customized keymap such as this in your application, open your
  19. -> own Intuition window, attach a console device to it, and then use the
  20. -> console device SETKEYMAP command to set your console device unit to your
  21. -> custom keymap.
  22.  
  23. ->>> Header (globals)
  24. OPT MODULE
  25.  
  26. MODULE 'keymap',
  27.        'devices/keymap'
  28.  
  29. ENUM ERR_NONE, ERR_ASK, ERR_LIB
  30.  
  31. RAISE ERR_ASK IF AskKeyMapDefault()=NIL,
  32.       ERR_LIB IF OpenLibrary()=NIL
  33.  
  34. -> Raw keys we might want to remap which are the same on all keyboards
  35. EXPORT ENUM UP_KEY=$4C, DOWN_KEY, RIGHT_KEY, LEFT_KEY, F1_KEY, F2_KEY, F3_KEY,
  36.        F4_KEY, F5_KEY, F6_KEY, F7_KEY, F8_KEY, F9_KEY, F10_KEY
  37.  
  38. EXPORT CONST N0_KEY=$0F, N1_KEY=$1D, N2_KEY=$1E, N3_KEY=$1F, N4_KEY=$2D,
  39.              N5_KEY=$2E, N6_KEY=$2F, N7_KEY=$3D, N8_KEY=$3E, N9_KEY=$3F
  40.  
  41. EXPORT CONST NPERIOD_KEY=$3C, NOPAREN_KEY=$5A, NCPAREN_KEY=$5B, NSLASH_KEY=$5C,
  42.              NASTER_KEY=$5D,  NMINUS_KEY=$4A,  NPLUS_KEY=$5E,   NENTER_KEY=$43
  43.  
  44. EXPORT CONST RETURN_KEY=$44, HELP_KEY=$5F
  45.  
  46. -> Count of elements in keymap arrays
  47. EXPORT CONST MAP_SIZE=64, TYPE_SIZE=64, CAPS_SIZE=8, REPS_SIZE=8
  48. EXPORT CONST MAP_SIZE_P=MAP_SIZE*2, TYPE_SIZE_P=TYPE_SIZE*2,
  49.              CAPS_SIZE_P=CAPS_SIZE*2, REPS_SIZE_P=REPS_SIZE*2
  50.  
  51. -> We allocate our Lo and Hi array pairs each as a single array
  52. EXPORT OBJECT keyMapArrays
  53.    lhKeyMap[MAP_SIZE_P]:ARRAY OF LONG
  54.    lhKeyMapTypes[TYPE_SIZE_P]:ARRAY
  55.    lhCapsable[CAPS_SIZE_P]:ARRAY
  56.    lhRepeatable[REPS_SIZE_P]:ARRAY
  57. ENDOBJECT
  58.  
  59. DEF karrays:PTR TO keyMapArrays, defkeymap:PTR TO keymap,
  60.     appkeymap:PTR TO keymap, mapsize
  61. ->>>
  62.  
  63. ->>> EXPORT PROC createAppKeyMap()
  64. EXPORT PROC createAppKeyMap() HANDLE
  65.   keymapbase:=OpenLibrary('keymap.library', 37)
  66.   defkeymap:=NIL  -> E-Note: help with error trapping
  67.   -> Get a pointer to the keymap which is set as the system default
  68.   defkeymap:=AskKeyMapDefault()
  69.   -> Allocate our KeyMap structures and arrays
  70.   mapsize:=SIZEOF keymap+SIZEOF keyMapArrays
  71.   appkeymap:=NIL
  72.   appkeymap:=NewR(mapsize)
  73.   -> Init our appkeymap fields to point to our allocated arrays.
  74.   -> Each LH array contains a Lo and a Hi array.
  75.   -> E-Note: the +1 in the C version means +SIZEOF keymap
  76.   karrays:=appkeymap+SIZEOF keymap
  77.   appkeymap.lokeymap:=karrays.lhKeyMap
  78.   appkeymap.hikeymap:=karrays.lhKeyMap+(MAP_SIZE*(SIZEOF LONG))
  79.   appkeymap.lokeymaptypes:=karrays.lhKeyMapTypes
  80.   appkeymap.hikeymaptypes:=karrays.lhKeyMapTypes+TYPE_SIZE
  81.   appkeymap.locapsable:=karrays.lhCapsable
  82.   appkeymap.hicapsable:=karrays.lhCapsable+CAPS_SIZE
  83.   appkeymap.lorepeatable:=karrays.lhRepeatable
  84.   appkeymap.hirepeatable:=karrays.lhRepeatable+REPS_SIZE
  85.  
  86.   -> Copy the user's default system keymap arrays to our appkeymap arrays to
  87.   -> get the proper keymappings for the user's keyboard.
  88.   copyKeyMap(defkeymap, appkeymap)
  89.  
  90.   -> Now make our changes to our appkeymap
  91.   alterAppKeyMap(appkeymap)
  92. EXCEPT DO
  93.   IF keymapbase THEN CloseLibrary(keymapbase)
  94. ENDPROC appkeymap
  95. ->>>
  96.  
  97. ->>> EXPORT PROC deleteAppKeyMap(appkeymap:PTR TO keymap)
  98. EXPORT PROC deleteAppKeyMap(appkeymap:PTR TO keymap)
  99.   IF appkeymap THEN Dispose(appkeymap)
  100. ENDPROC
  101. ->>>
  102.  
  103. ->>> PROC alterAppKeyMap(appkeymap:PTR TO keymap)
  104. PROC alterAppKeyMap(appkeymap:PTR TO keymap)
  105.   DEF nullkeys, keymappings:PTR TO LONG, keymaptypes, rawkeynum, i
  106.   -> NIL terminated ARRAY of keys our application wants to remap or disable
  107.   nullkeys:=[N0_KEY,      N1_KEY,      N2_KEY,      N3_KEY,      N4_KEY,
  108.              N5_KEY,      N6_KEY,      N7_KEY,      N8_KEY,      N9_KEY,
  109.              NPERIOD_KEY, NOPAREN_KEY, NCPAREN_KEY, NSLASH_KEY,
  110.              NASTER_KEY,  NMINUS_KEY,  NPLUS_KEY,   NENTER_KEY,
  111.              NIL]:CHAR
  112.   -> Our application wants numeric pad keys remapped to nothing so that we can
  113.   -> use this keymap with MapANSI and NOT get back raw codes for numeric
  114.   -> keypad.  Alternatively (for example) you could set the types to
  115.   -> KCF_STRING and set the mappings to point to NIL terminated strings.
  116.   keymappings:=appkeymap.lokeymap
  117.   keymaptypes:=appkeymap.lokeymaptypes
  118.  
  119.   i:=0
  120.   WHILE rawkeynum:=nullkeys[i]
  121.     -> Because we allocated each of our Lo and Hi ARRAY pairs as sequential
  122.     -> memory, we can use the RAWKEY values directly to index into our
  123.     -> sequential Lo/Hi ARRAY
  124.     keymaptypes[rawkeynum]:=KCF_NOP
  125.     INC i
  126.   ENDWHILE
  127. ENDPROC
  128. ->>>
  129.  
  130. ->>> PROC copyKeyMap(s:PTR TO keymap, d:PTR TO keymap)
  131. PROC copyKeyMap(s:PTR TO keymap, d:PTR TO keymap)
  132.   DEF bb, ll:PTR TO LONG, i
  133.   -> Copy keymap s (source) to keymap d (dest)
  134.   ll:=s.lokeymap
  135.   FOR i:=0 TO MAP_SIZE-1 DO d.lokeymap[i]:=ll[]++
  136.   ll:=s.hikeymap
  137.   FOR i:=0 TO MAP_SIZE-1 DO d.hikeymap[i]:=ll[]++
  138.  
  139.   bb:=s.lokeymaptypes
  140.   FOR i:=0 TO TYPE_SIZE-1 DO d.lokeymaptypes[i]:=bb[]++
  141.   bb:=s.hikeymaptypes
  142.   FOR i:=0 TO TYPE_SIZE-1 DO d.hikeymaptypes[i]:=bb[]++
  143.  
  144.   bb:=s.locapsable
  145.   FOR i:=0 TO CAPS_SIZE-1 DO d.locapsable[i]:=bb[]++
  146.   bb:=s.hicapsable
  147.   FOR i:=0 TO CAPS_SIZE-1 DO d.hicapsable[i]:=bb[]++
  148.  
  149.   bb:=s.lorepeatable
  150.   FOR i:=0 TO REPS_SIZE-1 DO d.lorepeatable[i]:=bb[]++
  151.   bb:=s.hirepeatable
  152.   FOR i:=0 TO REPS_SIZE-1 DO d.hirepeatable[i]:=bb[]++
  153. ENDPROC
  154. ->>>
  155.  
  156.